package cc.lucien.controller;

import cc.lucien.entity.Admin;
import cc.lucien.entity.AdminVO;
import cc.lucien.entity.Role;
import cc.lucien.service.AdminService;
import cc.lucien.service.GoodTypeService;
import cc.lucien.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
 * @author lucien-ma
 * @date 2021/11/15
 * @apiNote
 */
@Controller
@RequestMapping("/admin")
public class AdminController {

    @Autowired
    private AdminService adminService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private GoodTypeService goodTypeService;

    /**
     * 去到主页
     * @param session
     * @return
     */
    @GetMapping("/main")
    public String main(HttpSession session) {
        // 从session会话域中拿出保存的数据
        Admin admin = (Admin) session.getAttribute("admin");
        // 如果 admin为null说明还没有登录，重定向到登录页面
        if (admin == null) {
            return "redirect:/login/toLogin";
        }
        /*
         我们的管理员是分等级的，有普通管理员和超级管理员
         我们做个简单的权限管理，超级管理员有更多的操作权限
         */
        // 判断角色，进入不同的页面
        if ("超级管理员".equals(admin.getRole().getRoleName())) {
            // 说明是超级管理员
            return "superMain";
        }
        // 去到普通管理员主页
        return "main";
    }

    /**
     * 返回请求的jsp页面和需要的数据
     * @param name
     * @return
     */
    @GetMapping("/getJsp/{name}")
    public String getJsp(@PathVariable("name") String name, Map<String, Object> map) {
        switch (name) {
            case "adminAdd":
                map.put("roleList", roleService.findAll());
                break;
            case "goodsAdd":
                map.put("goodTypeList", goodTypeService.findAll());
                break;
        }
        return name;
    }

    /**
     * 向页面返回 json 数据
     * @return
     */
    @GetMapping("/show")
    @ResponseBody
    public AdminVO show() {
        AdminVO adminVO = new AdminVO();
        adminVO.setCode(0);
        adminVO.setMsg("");
        adminVO.setCount(200L);
        adminVO.setData(adminService.findAll());
        return adminVO;
    }

    @GetMapping("/findAll")
    @ResponseBody
    public List<Admin> findAll() {
        return adminService.findAll();
    }

    @GetMapping("/findById/{id}")
    @ResponseBody
    public Admin findById(@PathVariable("id") Integer id) {
        return adminService.findById(id);
    }

    @PostMapping("/save")
    public String save(Admin admin) {
        // 保存数据
        adminService.save(admin);
        // 跳转视图
        return "redirect:/admin/getJsp/adminTable";
    }

    /**
     * 查询数据并去到修改页面
     * @param id
     * @return
     */
    @GetMapping("/toUpdate/{id}")
    public ModelAndView toUpdate(@PathVariable("id") Integer id) {
        ModelAndView modelAndView = new ModelAndView();
        Admin admin = adminService.findById(id);
        List<Role> roleList = roleService.findAll();
        modelAndView.setViewName("adminUpdate");
        modelAndView.addObject("admin", admin);
        modelAndView.addObject("roleList", roleList);
        return modelAndView;
    }

    /**
     * 修改数据
     * @param admin
     * @return
     */
    @PostMapping("/update")
    public String update(Admin admin) {
        adminService.update(admin);
        return "redirect:/admin/getJsp/adminTable";
    }

    /**
     * 删除数据并去到查询页面
     * @param id
     * @return
     */
    @GetMapping("/deleteById/{id}")
    public String deleteById(@PathVariable("id") Integer id) {
        adminService.deleteById(id);
        return "adminTable";
    }
}
